﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using DblogStudio.DAL.Models;

namespace DblogStudio.BLL
{
    public partial class BizMaySanXuat
    {
        public static void GetStatisCanhBao(string maMaySanXuat, out int quaHan, out int trongHan, out int truocHan, string manv = "")
        {
            using (var db = CEMS4UG_DHKHContext.GetContext())
            {
                var lsCTMDPC = db.PhanCongBaoTriDbSet.Where(e => e.MaNhanVien == manv).Select(e => e.MaChiTietMay).ToList();
                var cb = int.Parse(BizAppConfig.GetDSCanhBaoDesktop());
                if (string.IsNullOrEmpty(manv))
                    cb = 1000;
                DateTime dt = DateTime.Now.AddDays(cb);
                var ls = db.LichBaoTriDbSet.Where(e =>
                    e.ChiTietMay.BoPhanMay.MaySanXuat.MaMaySanXuat == maMaySanXuat && e.NgayBaoTri <= dt &&
                    (string.IsNullOrEmpty(manv) ? true : lsCTMDPC.Contains(e.MaChiTietMay)))
                    .ToList();
                trongHan = ls.Count(e => DateTime.Now.Date.Subtract(e.NgayBaoTri.Date).Days <= 0.3 * e.ChuKy && DateTime.Now.Date.Subtract(e.NgayBaoTri.Date).Days >= 0);
                quaHan = ls.Count(e => DateTime.Now.Date.Subtract(e.NgayBaoTri.Date).Days > 0.3 * e.ChuKy);
                truocHan = ls.Count(e => DateTime.Now.Date.Subtract(e.NgayBaoTri.Date).Days < 0);
            }
        }
        public static List<MaySanXuat> GetList()
        {
            using (var db = CEMS4UG_DHKHContext.GetContext())
            {
                return db.MaySanXuatDbSet.OrderBy(e => e.TenMaySanXuat).ToList();
            }
        }
        public static List<MaySanXuat> GetList(string maCongDoan, CEMS4UG_DHKHContext db = null)
        {
            if (db == null)
            {
                using (db = CEMS4UG_DHKHContext.GetContext())
                {
                    return GetList(maCongDoan, db);
                }
            }
            else
            {
                return db.MaySanXuatDbSet.Where(e => e.MaCongDoanSanXuat == maCongDoan).OrderBy(e => e.TenMaySanXuat).ToList();
            }
        }

        public static void SaoChep(string maMayFrom, string maMayTo, CEMS4UG_DHKHContext db = null)
        {
            if (db == null)
            {
                using (db = CEMS4UG_DHKHContext.GetContext())
                {
                    SaoChep(maMayFrom, maMayTo, db);
                }
            }
            else
            {
                //Lấy danh sách bộ phần máy cần sao chép
                var lsBoPhanMay = db.BoPhanMayDbSet.Where(e => e.MaMaySanXuat == maMayFrom).ToList();
                if (lsBoPhanMay != null && lsBoPhanMay.Count > 0)
                {
                    foreach (var bpm in lsBoPhanMay)
                    {
                        //Kiểm tra bộ phận máy này đã tồn tại ở máy cần sao chép đến chưa
                        var bpmTo = db.BoPhanMayDbSet.Where(e =>
                            e.TenBoPhanMay == bpm.TenBoPhanMay &&
                            e.MaMaySanXuat == maMayTo
                            ).FirstOrDefault();
                        if (bpmTo == null)
                        {
                            bpmTo = new BoPhanMay
                            {
                                MaBoPhanMay = Guid.NewGuid().ToString(),
                                MaMaySanXuat = maMayTo,
                                TenBoPhanMay = bpm.TenBoPhanMay,
                                GhiChu = bpm.GhiChu
                            };
                            db.BoPhanMayDbSet.Add(bpmTo);
                            db.SaveChanges();
                        }
                        var lsChiTietMay = db.ChiTietMayDbSet.Where(e => e.MaBoPhanMay == bpm.MaBoPhanMay).ToList();
                        if (lsChiTietMay != null && lsChiTietMay.Count > 0)
                        {
                            foreach (var ctm in lsChiTietMay)
                            {
                                //Kiểm tra chi tiết máy này đã tồn tại trong bộ phận máy cần sao chép hay chưa
                                var ctmTo = db.ChiTietMayDbSet.Where(e => e.MaBoPhanMay == bpmTo.MaBoPhanMay &&
                                    e.TenChiTietMay == ctm.TenChiTietMay).FirstOrDefault();
                                if (ctmTo == null)
                                {
                                    ctmTo = new ChiTietMay
                                    {
                                        MaChiTietMay = Guid.NewGuid().ToString(),
                                        TenChiTietMay = ctm.TenChiTietMay,
                                        MaBoPhanMay = bpmTo.MaBoPhanMay,
                                        GhiChu = ctm.GhiChu
                                    };
                                    db.ChiTietMayDbSet.Add(ctmTo);
                                    db.SaveChanges();
                                }
                                var lsLichBaoTri = db.LichBaoTriDbSet.Where(e => e.MaChiTietMay == ctm.MaChiTietMay).ToList();
                                if (lsLichBaoTri != null && lsLichBaoTri.Count > 0)
                                {
                                    foreach (var lich in lsLichBaoTri)
                                    {
                                        var lichTo = db.LichBaoTriDbSet.Where(e => e.MaChiTietMay == ctmTo.MaChiTietMay &&
                                            e.MaNhiemVuBaoTri == lich.MaNhiemVuBaoTri).FirstOrDefault();
                                        if (lichTo == null)
                                        {
                                            lichTo = new LichBaoTri
                                            {
                                                MaLichBaoTri = Guid.NewGuid().ToString(),
                                                MaChiTietMay = ctmTo.MaChiTietMay,
                                                MaNhiemVuBaoTri = lich.MaNhiemVuBaoTri,
                                                NgayBaoTri = lich.NgayBaoTri,
                                                ChuKy = lich.ChuKy,
                                                GhiChu = lich.GhiChu,
                                            };
                                            db.LichBaoTriDbSet.Add(lichTo);
                                            db.SaveChanges();
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }

        /// <summary>
        /// Lấy theo ID
        /// </summary>
        /// <param name="maCoSoDaoTao"></param>
        /// <returns></returns>
        public static MaySanXuat GetByID(string maMay, CEMS4UG_DHKHContext db = null)
        {
            if (db == null)
                using (db = CEMS4UG_DHKHContext.GetContext())
                {
                    return GetByID(maMay, db);
                }
            else
            {
                return db.MaySanXuatDbSet.Where(e => e.MaMaySanXuat == maMay).FirstOrDefault();
            }
        }



        /// <summary>
        /// Kiểm tra tên cơ sở đào tạo có trùng hay không
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        public static bool IsExistByName(string tenMay)
        {
            using (var db = CEMS4UG_DHKHContext.GetContext())
            {
                return db.MaySanXuatDbSet.Where(e => e.TenMaySanXuat == tenMay).FirstOrDefault() != null ? true : false;
            }
        }

        public static CODE_RESULT_RETURN Add(MaySanXuat obj)
        {
            using (var db = CEMS4UG_DHKHContext.GetContext())
            {
                if (IsExistByName(obj.TenMaySanXuat))
                    return CODE_RESULT_RETURN.TenTrung;
                obj.MaMaySanXuat = Guid.NewGuid().ToString();
                try
                {
                    db.MaySanXuatDbSet.Add(obj);
                    db.SaveChanges();
                    NhatKyHoatDong nhatKy = new NhatKyHoatDong();
                    BizNhatKyHoatDong.InitData<MaySanXuat>(nhatKy, null, obj.MaMaySanXuat, LOAIDOITUONG.MÁY_SẢN_XUẤT, LOAITHAOTAC.Thêm);
                    BizNhatKyHoatDong.Add(nhatKy, obj);
                    return CODE_RESULT_RETURN.ThanhCong;
                }
                catch (Exception ex)
                {
                    throw new Exception(ex.ToString());
                    return CODE_RESULT_RETURN.ThatBai;
                }
            }
        }

        public static CODE_RESULT_RETURN Update(MaySanXuat obj)
        {
            using (var db = CEMS4UG_DHKHContext.GetContext())
            {
                var may = db.MaySanXuatDbSet.Where(e => e.MaMaySanXuat == obj.MaMaySanXuat).FirstOrDefault();
                if (may != null)
                {
                    var ten = db.MaySanXuatDbSet.Where(e => e.TenMaySanXuat == obj.TenMaySanXuat && e.MaMaySanXuat != may.MaMaySanXuat).FirstOrDefault();
                    if (ten != null)
                        return CODE_RESULT_RETURN.TenTrung;
                    NhatKyHoatDong nhatKy = new NhatKyHoatDong();
                    BizNhatKyHoatDong.InitData(nhatKy, may, may.MaCongDoanSanXuat, LOAIDOITUONG.MÁY_SẢN_XUẤT, LOAITHAOTAC.Chỉnh_sửa);
                    may.TenMaySanXuat = obj.TenMaySanXuat;
                    may.GhiChu = obj.GhiChu;
                    db.SaveChanges();
                    BizNhatKyHoatDong.Add(nhatKy, may);
                    return CODE_RESULT_RETURN.ThanhCong;
                }
                else
                {
                    throw new Exception("Đối tượng này không tồn tại");
                }
            }
        }

        public static CODE_RESULT_RETURN Delete(string maMay)
        {
            using (var db = CEMS4UG_DHKHContext.GetContext())
            {
                var may = db.MaySanXuatDbSet.Where(e => e.MaMaySanXuat == maMay).FirstOrDefault();
                if (may != null)
                {
                    if (!(may.ListBoPhanMay != null && may.ListBoPhanMay.Count > 0)
                        )
                    {
                        db.MaySanXuatDbSet.Remove(may);
                        db.SaveChanges();
                        NhatKyHoatDong nhatKy = new NhatKyHoatDong();
                        BizNhatKyHoatDong.InitData<MaySanXuat>(nhatKy, may, may.MaMaySanXuat, LOAIDOITUONG.MÁY_SẢN_XUẤT, LOAITHAOTAC.Xóa);
                        BizNhatKyHoatDong.Add<CongDoanSanXuat>(nhatKy, null);
                        return CODE_RESULT_RETURN.ThanhCong;
                    }
                    else
                        return CODE_RESULT_RETURN.ThatBai;
                }
                else
                {
                    return CODE_RESULT_RETURN.ThatBai;
                }
            }
        }
    }

}
